import { defineStore } from "pinia";




interface IStateRes {
  menus: IMenuItem[];
  username: string;
  roles: string[]
}


// 将请求回来的adminInfo.menus存到仓库里。
export const useUserInfoStore = defineStore('menus', {
  state: (): IStateRes => {
    return {
      menus: [],
      username: '',
      roles: [],
    }
  },
  getters: {
    sortedMenu: (state) => {
      // 1.sort 把所有的一级菜单排在数组的前面，二级菜单放在数组的后面
      // 2.进行排序后的数组的循环，判断数组项的parentId是否为0，如果为0，增加一个字段children,用来存放子级
      // 3.判断数组项的parentId是否不等于0，如果不等于0，说明他有父级，就要根据parentId去找父级,找到父级后，把这一项push到父级的children里面
      // 4.对新数组进行过滤，只保留一级菜单，二级菜单不需要了，因为已经push到一级菜单里面了
      // 5.需要对过滤后的数组进行id排序，从小到大的顺序




      // 将原数组分层级地过滤出来。

      let menus = [...state.menus];

      // 1 将第一层提前到数组前面。
      menus.sort((a, b) => { return a.parentId - b.parentId });

      // 2 遍历数据，层级0的添加一个children属性，层级不为0的，且hidden为0的，找到它的parentId的对应索引，将当前项添加进对应索引的一项的children
      menus.forEach((item, index) => {
        // ，层级0的添加一个children属性
        if (item.parentId === 0) {
          item.children = [];
        } else {
          // 层级不为0的
          if (item.hidden === 0) {
            // 找到parentId对应的那项的索引
            let idx = menus.findIndex(el => el.id === item.parentId);
            if (idx > -1) {
              menus[idx].children?.push(item);
            }

          }
        }

      })

      // 筛选出第一层，并排序
      menus = menus.filter(item => item.parentId === 0);
      menus.sort((a, b) => a.id - b.id);

      return menus
    }
  },
  actions: {
    // 接收新数据
    updateUserInfo(menus: IMenuItem[], username: string, roles: string[]) {
      this.menus = menus;
      this.username = username;
      this.roles = roles;
    }
    // 另一种写法:属性选择器选中iStateRes内的menus
    //   updateMenus(menu: IStateRes["menus"]) {
    //   this.menus = menu;
    // }
  }
})